VPC内のEC2インスタンスに複数IPアドレスを割り当てる
EC2インスタンスに複数IPアドレスを割り当てる
先日、大きな注目の機能追加がありました。1つのインスタンスに複数のIPアドレスを割り当てられるようになったのです。パブリックIPとプライベートIPをセットにして割り当てることができます。これにより、IPベースのバーチャルホストなどを組むことができるようになります。
ENIって?
ENI(Elastic Network Interface)は、EC2インスタンスに挿す仮想のNIC(ネットワークカード)です。1つのNIC毎に最大で30IPまで設定でき、1つのインスタンス毎に最大で8枚のNICの設定できますので、240のIPアドレスを設定することができます。インスタンスタイプを大きく設定しなければいけませんが、何台もインスタンスを用意することなくたくさんのIPアドレスを使うことができます。
ENIを作成する
ENIを使って仮想NICを作成してみましょう。この仮想NICは、サブネットを指定する必要があります。たとえば、CIDR 10.0.0.0/24のサブネットを指定して、仮想NICに割り当てるIPアドレスとして10.0.0.100を指定します。このIPアドレスは、プライマリIPと呼ばれます。仮想NICは個別にセキュリティグループを指定することもできます。今まで、IPアドレスやセキュリティグループは、EC2インスタンスに付与する概念でしたが、これからは仮想NICに付与するという概念を持つ必要がありそうですね。
セカンダリIPを設定する
作成した仮想NICに2つ以上のIPアドレスを設定してみましょう。Manage Private IP Addressというメニューを選択して設定します。3つのセカンダリIPアドレスを設定しました。
パブリックIPに関連づける
インターネットから到達可能なパブリックなIPアドレスを取得するには、EIP(Elastic IP)を用います。管理コンソールから作成しましょう。ちなみに、EC2とVPCではEIPの管理が別となりますので作成時にVPCを指定してください。今回は新規に4つのEIPを取得します。
4つのIPアドレスを取得しました。
仮想NICにパブリックIPアドレスを設定する
仮想NICに設定したプライベートIPとEIPで取得したパブリックIPをペアにしたいと思います。Network Interfacesの管理画面からAssociate Addressを選択してIPアドレスを指定します。4回繰り返して全てのペアを作成します。
VPCインスタンスを起動する際にENIを指定する
インスタンスを起動する際に仮想NICを指定しましょう。まずはVPCを指定して仮想NICが属しているサブネットを指定します。
次に先ほど作成した仮想NICを指定します。これで設定は完了です。
Apacheを入れて動作確認をする
SSHでログインしてApacheをインストールします。プライマリIPを指定してSSHします。
$ sudo yum install httpd-devel -y $ sudo service httpd start Starting httpd: httpd: apr_sockaddr_info_get() failed for ip-10-0-0-100 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [ OK ] [ec2-user@ip-10-0-0-100 ~]$ sudo chkconfig httpd on
Apacheを起動するとホスト名が指定されていないと怒られます。そこで以下のように設定してアラートを消しました。
$ sudo vi /etc/hosts 127.0.0.1 localhost localhost.localdomain ip-10-0-0-100 $ sudo vi /etc/httpd/conf/httpd.conf ServerName 127.0.0.1:80 $ sudo service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
ブラウザで確認してみましょう。ちゃんとApacheのデフォルトページが表示されました。
次にセカンダリのパブリックIPを指定して確認してみます。あれ?表示されません。これは期待通りの動きです。管理コンソール上で仮想NICの設定をしましたが、OS側で設定がされていないからです。
Linux側でNICの設定をする
ここからはLinuxのお話。NICの現在の設定を確認します。
$ ifconfig eth0 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23819 errors:0 dropped:0 overruns:0 frame:0 TX packets:7860 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:29957088 (28.5 MiB) TX bytes:768788 (750.7 KiB) Interrupt:26 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
ルーティングも見てみましょう
$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.169.254 * 255.255.255.255 UH 0 0 0 eth0
セカンダリのIPアドレスが設定されていないことが分かりました。そこで、NICの設定を追加します。Linuxの再起動時に自動で設定させる方法が2つあります。ifconfigコマンドを起動時のスクリプトに入れておく、または、sysconfigに書いておくです。まずはsysconfigの設定をやってみましょう。
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0:1 DEVICE=eth0:1 BOOTPROTO=static BROADCAST=10.0.0.255 IPADDR=10.0.0.101 NETMASK=255.255.255.0 NETWORK=10.0.0.1 ONBOOT=yes
設定を保存したらネットワークサービスを再起動します。次にifconfigコマンドでNICが設定されているか確認します。
$ sudo service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining IP information for eth0... done. [ OK ] $ ifconfig eth0 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24216 errors:0 dropped:0 overruns:0 frame:0 TX packets:8116 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:29986248 (28.5 MiB) TX bytes:814068 (794.9 KiB) Interrupt:26 eth0:1 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.101 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:26 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
いいかんじですね。それでは、追加したNICのプライベートIPとペアとなっているパブリックIPを使ってブラウザから動作確認してみてください。Awesome !!
次にifconfigコマンドでNICを追加したいと思います。
$ sudo ifconfig eth0:2 10.0.0.102 netmask 255.255.255.0 broadcast 10.0.0.255 $ ifconfig eth0 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:25441 errors:0 dropped:0 overruns:0 frame:0 TX packets:8801 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:30078650 (28.6 MiB) TX bytes:918650 (897.1 KiB) Interrupt:26 eth0:1 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.101 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:26 eth0:2 Link encap:Ethernet HWaddr 02:8D:71:1D:1F:2A inet addr:10.0.0.102 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:26 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
ちゃんと追加されていましたね。追加したプライベートIPとペアであるパブリックIPで接続できるかブラウザから動作確認を忘れずに
IPベースのバーチャルホストを設定する
IPベースのバーチャルホストは、1台のインスタンスで複数のサイトを運営することができます。まずはじめにRoute53でドメインとパブリックIPの関連づけを行います。
次に、Apacheの設定を変更します。ドメイン毎にプライベートIPアドレスを指定してください。
$ sudo vi /etc/httpd/conf/httpd.conf
<VirtualHost 10.0.0.101:80> ServerAdmin [email protected] DocumentRoot /var/www/www1/ ServerName www1.akari7.net ErrorLog logs/www1.akari7.net-error_log CustomLog logs/www1.akari7.net-access_log common </VirtualHost> <VirtualHost 10.0.0.102:80> ServerAdmin [email protected] DocumentRoot /var/www/www2/ ServerName www2.akari7.net ErrorLog logs/www2.akari7.net-error_log CustomLog logs/www2.akari7.net-access_log common </VirtualHost>
Apacheを再起動してブラウザからドメイン名で確認すると振り分けられていることが確認できます!
$ sudo service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
まとめ
VPC内でENIとEIPを組み合わせて仮想NICに複数のパブリック&ブライベートIPアドレスを付与できる事が分かりました!既存のシステムが複数IPで動いていることによって、AWSクラウドを使えなかった企業も多いのではないでしょうか。これからはご安心を。1台で複数IP設定できます!例えばメールの送信元IPをたくさん設定できそうですね!今日から君をNIC NICにしてあげる♪(アキバモード)